//
// Created by pzw on 24-3-1.
//

#ifndef QTTEST_TREESET_H
#define QTTEST_TREESET_H

#include <set>

#include "TreeSet.h"
#include <set>
#include <vector>
#include <functional>
#include <iostream>

template<typename T>
class TreeSetComparator;

template<typename T>
class TreeSetIterator;

template<typename T>
class TreeSet {
private:
    std::set<T> treeSet;
    TreeSetComparator<T> comparator;


public:
    /*构造函数*/
    TreeSet();
    explicit TreeSet(const std::set<T> &s);
    explicit TreeSet(TreeSetComparator<int> comparator);
    ~TreeSet() = default;

    /*添加和删除元素*/
    bool add(const T &e);
    bool addAll(const std::set<T> &s);
    bool remove(const T &o);
    void clear();

    /*访问元素*/
    T first();
    T last();
    T lower(T e);
    T higher(T e);
    T floor(T e);
    T ceiling(T e);
    T pollFirst();
    T pollLast();

    /*集合操作*/
    int size();
    bool isEmpty();
    bool contains(const T &o);
    bool containsAll(const std::set<T> &c);
    bool removeAll(const std::set<T> &c);
    bool retainAll(const std::set<T> &c);

    /*迭代器*/
    TreeSetIterator<T> iterator();
    TreeSetIterator<T> descendingIterator();

    /*范围视图*/
    std::set<T> descendingSet();
    std::set<T> subSet(T fromElement, bool fromInclusive, T toElement, bool toInclusive);
    std::set<T> headSet(T toElement, bool inclusive);
    std::set<T> tailSet(T fromElement, bool inclusive);
    std::set<T> subSet(T fromElement, T toElement);
    std::set<T> headSet(T toElement);
    std::set<T> tailSet(T fromElement);

    /*数组操作*/
    std::vector<T> toArray();
    template<typename U>
    std::vector<U> toArray(std::vector<U> &a);

    /*比较和哈希*/
    TreeSetComparator<T> getComparator();
    typename std::set<T>::key_compare getKeyComparator();
    std::set<T> spliterator();
};


/**
 * 比较器
 *
 * @tparam T - 模板参数
 */
template<typename T>
class TreeSetComparator {
public:
    bool operator()(const T &a, const T &b) const {
        return a < b; // 根据具体需求定义比较规则
    }
};


/**
 * 迭代器
 *
 * @tparam T - 模板参数
 */
template<typename T>
class TreeSetIterator {
private:
    typename std::set<T>::iterator it;
    typename std::set<T> &setRef;

public:
    explicit TreeSetIterator(typename std::set<T> &set) : setRef(set) {
        it = setRef.begin();
    }

    /**
     * java 的 hasNext函数
     *
     * @return it is end?
     */
    bool hasNext() {
        return it != setRef.end();
    }

    /**
     * 获取当前值，并且迭代器自增
     *
     * @return 当前值
     */
    T next() {
        if (it == setRef.end()) {
            // Handle error or exception
            throw std::out_of_range("Iterator out of range");
        }
        T value = *it;
        ++it;
        return value;
    }

    /**
     * 移出当前值，并且迭代器自减
     *
     * @return void
     */
    void remove() {
        if (it != setRef.begin()) { // 确保不是在容器的开始位置尝试删除
            // 删除元素，并将迭代器移动到下一个有效元素
            typename std::set<T>::iterator &itr = --it;
            it = setRef.erase(itr);
        } else {
            std::cout << "Cannot remove before calling next" << std::endl;
        }
    }

};

int TreeSet_main();

#endif //QTTEST_TREESET_H
